package com.slatch;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.io.InputStream;

import java.io.IOException;
import java.io.InputStream;
 
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.FileOutputStream;

import android.net.Uri;
import android.util.Log;

public class Partie {
	
	private int anombrecaseX;
	private int anombrecaseY;
	private Terrain[][] aTerrain;
	private int aJoueurActuel;
	private int aTour;
	private int aNbrJoueur;
	private List<Joueur> ListeJoueur;
	private int aNbrJoueurMort;
    public boolean partieFinie = false;
	
	int aRevenuBatiment;
	
	public Partie (/*final int pRevenuBatiment*/) {
		aNbrJoueurMort=0;
		aJoueurActuel= 1;
		aTour = 1;
		initMap();
		aRevenuBatiment=50;
		//aRevenuBatiment = pRevenuBatiment;
		
	}
	
	/**
     * Methode qui permet le chargement d'une carte depuis un fichier texte et créé les Joueurs
     * 
     */
    private void initMap(){
    	
    	int vBatimentJoueur[];
		
		List<Unite> lUnite = new ArrayList<Unite>();
        List<Terrain> lUsine = new ArrayList<Terrain>();
        List<Terrain> lBatiment = new ArrayList<Terrain>();
	
		/*
		for(int i=0; i<anombrecaseX; i++){
            for(int j=0; j<anombrecaseY; j++){
                if((i==4 && j==4) || (i==27 && j==4) || (i==5 && j==5) || (i==26 && j==5)) 
                	aTerrain[i][j] = new Terrain(i,j,0,TypeTerrain.FORET);
                else if((i==4 && j==13) || (i==27 && j==13) || (i==5 && j==12) || (i==26 && j==12)) 
                	aTerrain[i][j] = new Terrain(i,j,0,TypeTerrain.MONTAGNE);
                else if(i==0 || j==0 || i==anombrecaseX-1 || j==anombrecaseY-1 || i==1 || j==1 || i==anombrecaseX-2 || j==anombrecaseY-2)
                	aTerrain[i][j] = new Terrain(i,j,0,TypeTerrain.MONTAGNE);
                else if(i==2 && j==2) {
                	aTerrain[i][j] = new Terrain(i,j,1,TypeTerrain.USINE);
                	vBatimentJoueur[1]+=1;
                }
                else if(i==29 && j==2) {
                	aTerrain[i][j] = new Terrain(i,j,2,TypeTerrain.USINE);
                	vBatimentJoueur[2]+=1;
                }
                else if(i==2 && j==4) {
                	aTerrain[i][j] = new Terrain(i,j,1,TypeTerrain.BATIMENT);
                	vBatimentJoueur[1]+=1;
                }
                else if(i==29 && j==4) {
                	aTerrain[i][j] = new Terrain(i,j,2,TypeTerrain.BATIMENT);
                	vBatimentJoueur[2]+=1;
                }
                else 
                	aTerrain[i][j] = new Terrain(i,j,0,TypeTerrain.PLAINE);
            }
        } */
        
			
			String[] tabLigne = MainActivity.map.split("_");
			
	    	anombrecaseX = Integer.parseInt(tabLigne[0]);
			anombrecaseY = Integer.parseInt(tabLigne[1]);
			aNbrJoueur=Integer.parseInt(tabLigne[2]);;
	    	vBatimentJoueur = new int[aNbrJoueur+1];
			aTerrain = new Terrain[anombrecaseX][anombrecaseY];
			
			for(int i=0; i<anombrecaseX; i++){
	            for(int j=0; j<anombrecaseY; j++){
	                aTerrain[i][j] = new Terrain(i, j, 0, TypeTerrain.PLAINE);
	            }
	        } 
			
			int aDebutMap=0;
			if(aNbrJoueur==2) aDebutMap=10;
			if(aNbrJoueur==4) aDebutMap=12;

			int vX, vY, vJoueur, vPV,vLvl,vExperience, vIntDejaDeplacee, vIntDejaAttaque;
	        boolean vDejaDeplacee=false;
	        boolean vDejaAttaque=false;
	        String vId;
	        String ligne = "";
	        String tab[] = null;

			for(int i=aDebutMap; i<tabLigne.length; i++) {
	            tab = tabLigne[i].split(":");
	            vId = tab[0];
	            vX = Integer.parseInt(tab[1]);
	            vY = Integer.parseInt(tab[2]);   
	            vJoueur = Integer.parseInt(tab[3]);
	            vPV = Integer.parseInt(tab[4]);
	            vExperience = Integer.parseInt(tab[5]);
	            vLvl = Integer.parseInt(tab[6]);
	            vIntDejaDeplacee = Integer.parseInt(tab[7]);
	            vIntDejaAttaque = Integer.parseInt(tab[8]);
	      
	            if(vIntDejaDeplacee==1)
	                vDejaDeplacee=true;
	            else
	                vDejaDeplacee=false;
	            
	            if(vIntDejaAttaque==1)
	                vDejaAttaque=true;
	            else
	                vDejaAttaque=false;
	            
	            if(vId.equals("foret")) 				aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.FORET);
	            else if(vId.equals("montagne")) 		aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.MONTAGNE); 
	            else if(vId.equals("eau")) 				aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.EAU);
	            else if(vId.equals("rivebas"))   		aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.RIVEBAS);
	            else if(vId.equals("rivehaut"))      	aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.RIVEHAUT); 
	            else if(vId.equals("rivedroite"))     	aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.RIVEDROITE); 
	            else if(vId.equals("rivegauche"))		aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.RIVEGAUCHE); 
	            else if(vId.equals("rivebasdroite"))	aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.RIVEBASDROITE); 
	            else if(vId.equals("rivebasgauche"))    aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.RIVEBASGAUCHE); 
	            else if(vId.equals("rivehautdroite"))   aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.RIVEHAUTDROITE); 
	            else if(vId.equals("rivehautgauche"))   aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.RIVEHAUTGAUCHE); 
	            else if(vId.equals("routehorizontal"))  aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.ROUTEHORIZONTAL); 
	            else if(vId.equals("routevertical"))    aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.ROUTEVERTICAL); 
	            else if(vId.equals("viragedroitebas"))  aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.VIRAGEDROITEBAS); 
	            else if(vId.equals("viragedroitehaut")) aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.VIRAGEDROITEHAUT); 
	            else if(vId.equals("viragegauchebas"))  aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.VIRAGEGAUCHEBAS); 
	            else if(vId.equals("viragegauchehaut")) aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.VIRAGEGAUCHEHAUT); 
	            else if(vId.equals("routethaut"))      	aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.ROUTETHAUT); 
	            else if(vId.equals("routetbas"))      	aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.ROUTETBAS); 
	            else if(vId.equals("routetdroite"))     aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.ROUTETDROITE); 
	            else if(vId.equals("routetgauche"))     aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.ROUTETGAUCHE); 
	            else if(vId.equals("carrefour"))      	aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.CARREFOUR); 
	            else if(vId.equals("batiment")) {   
		            aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.BATIMENT,vPV); 
		            vBatimentJoueur[vJoueur]+=1;
		            lBatiment.add(aTerrain[vX][vY]);
	            }
	            else if(vId.equals("usine")) {     
	                aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.USINE,vPV); 
	                vBatimentJoueur[vJoueur]+=1;
	                lUsine.add(aTerrain[vX][vY]);
	            }
	            else if(vId.equals("qg")) { 
	                aTerrain[vX][vY] = new Terrain(vX, vY, vJoueur, TypeTerrain.QG,vPV); 
	                vBatimentJoueur[vJoueur]+=1;
	            }
	            else if(vId.equals("Commando")) { 
	                Unite vcommando = new Unite(vX,vY,vJoueur,TypeUnite.COMMANDO,vPV,vExperience,vLvl,vDejaAttaque,vDejaDeplacee);
	                lUnite.add(vcommando);
	                aTerrain[vX][vY].setUnite(vcommando); 
	            }
	            else if(vId.equals("Demolisseur")) {  
	                Unite demolisseur = new Unite(vX,vY,vJoueur,TypeUnite.DEMOLISSEUR,vPV,vExperience,vLvl,vDejaAttaque,vDejaDeplacee);
	                lUnite.add(demolisseur);
	                aTerrain[vX][vY].setUnite(demolisseur); 
	            }
	            else if(vId.equals("While")) { 
	                Unite vtank = new Unite(vX,vY,vJoueur,TypeUnite.TANK,vPV,vExperience,vLvl,vDejaAttaque,vDejaDeplacee);
	                lUnite.add(vtank);
	                aTerrain[vX][vY].setUnite(vtank); 
	            }
	            else if(vId.equals("Char")) { 
	                Unite vchar = new Unite(vX,vY,vJoueur,TypeUnite.CHAR,vPV,vExperience,vLvl,vDejaAttaque,vDejaDeplacee);
	                lUnite.add(vchar);
	                aTerrain[vX][vY].setUnite(vchar); 
	            }
	            else if(vId.equals("Ingenieur")) { 
	                Unite ingenieur = new Unite(vX,vY,vJoueur,TypeUnite.INGENIEUR,vPV,vExperience,vLvl,vDejaAttaque,vDejaDeplacee);
	                lUnite.add(ingenieur);
	                aTerrain[vX][vY].setUnite(ingenieur); 
				}
	            else if(vId.equals("Distance")) { 
	                Unite distance = new Unite(vX,vY,vJoueur,TypeUnite.DISTANCE,vPV,vExperience,vLvl,vDejaAttaque,vDejaDeplacee);
	                lUnite.add(distance);
	                aTerrain[vX][vY].setUnite(distance); 
	    		}
	            else if(vId.equals("Uml")) { 
	                Unite uml = new Unite(vX,vY,vJoueur,TypeUnite.UML,vPV,vExperience,vLvl,vDejaAttaque,vDejaDeplacee);
	                lUnite.add(uml);
	                aTerrain[vX][vY].setUnite(uml); 
	            }
	            else {
	                aTerrain[vX][vY] = new Terrain(vX, vY, 0, TypeTerrain.PLAINE);
	            }
			}
			
			
			ListeJoueur = new ArrayList<Joueur>();
	        Joueur JoueurNeutre = new Joueur(0,Faction.NEUTRE,0); //Sert a occuper la place 0 dans la liste pour que le numero du joueur coresponde au numero dans la liste
	        ListeJoueur.add(JoueurNeutre);
	        
	        vBatimentJoueur[0]=0;
	        
	        //Ajout des joueur dans l'arrayList
	        for(int i=1;i<=aNbrJoueur;i++)
	        {
	            ListeJoueur.add(new Joueur(i,Faction.HUMAINS,vBatimentJoueur[i]));
	            ListeJoueur.get(i).benefTour(aRevenuBatiment);
	        }
	        ListeJoueur.get(1).benefTour(aRevenuBatiment);
	        for(Unite vUniteActuel : lUnite){
	        	int vJ = vUniteActuel.getJoueur();
	            ListeJoueur.get(vJ).getListeUnite().add(vUniteActuel);
	        }
			
			
			

		//Log.d("Partie_initMap", ""+tabLigne[10] );
		
		//tabLigne = MainActivity.doublevai.split("\n");
		//replaceAll(" ", "");

        
        
        
    } // Fin initMap
    

    public void tourSuivant(){
        if(aJoueurActuel == aNbrJoueur)
        {
            aJoueurActuel = 1;
            aTour++;
        }
        else
            aJoueurActuel++;    
        ListeJoueur.get(aJoueurActuel).benefTour(aRevenuBatiment); 
    }
    
    public void gagner(){
    	aNbrJoueurMort ++;
        if(aNbrJoueurMort == aNbrJoueur-1){
           this.partieFinie=true;
        }
    }
    
    public void construireUnite(final int pX,final int pY,final int pJoueur,final TypeUnite pType,List<Unite> liste){
    	Unite vVehicule = new Unite(pX, pY, pJoueur, pType);
        aTerrain[pX][pY].setUnite(vVehicule); 
        liste.add(vVehicule);
    }
	
	public int getanombrecaseX() {return anombrecaseX;}
	public int getanombrecaseY() {return anombrecaseY;}
	public Terrain[][] getTerrain() {return aTerrain;}
	public int getJoueurActuel() {return aJoueurActuel;}
	public int getTour() {return aTour;}
	public Joueur getJoueur(final int pJoueur) {return  ListeJoueur.get(pJoueur);}
}
